package api

import (
	"pids-cloud-server/app/common"
	"pids-cloud-server/app/middleware"
	"pids-cloud-server/entity"
	"pids-cloud-server/utils"

	"github.com/gin-gonic/gin"
)

// GetInterfaceList 获取接口信息列表
// @Summary 获取接口信息列表
// @Description 获取接口信息列表，支持分页和条件筛选
// @Tags 接口信息
// @Accept json
// @Produce json
// @Param page query int false "页码，默认1"
// @Param pageSize query int false "每页大小，默认10"
// @Param ip query string false "接口IP"
// @Param state query string false "接口状态(0:正常,1:异常)"
// @Param interface_name query string false "接口名称"
// @Success 200 {object} common.Result{data=common.PageResult{list=[]entity.InterfaceInfo}} "成功"
// @Failure 500 {object} common.Result "失败"
// @Router /interface/list [get]
func GetInterfaceList(c *gin.Context) {
	// 从上下文中获取分页参数
	pagination, _ := c.Get("pagination")
	paging := pagination.(*middleware.PaginationParams)

	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, 500, "数据库连接失败")
		return
	}
	ip := c.Query("ip")
	interfaceName := c.Query("interface_name")
	state := c.Query("state")

	query := db.Model(&entity.InterfaceInfo{})
	if ip != "" {
		query = query.Where("ip LIKE ?", "%"+ip+"%")
	}
	if interfaceName != "" {
		query = query.Where("interface_name = ?", interfaceName)
	}
	if state != "" {
		query = query.Where("state = ?", state)
	}

	// 获取总记录数
	var total int64
	if err := query.Count(&total).Error; err != nil {
		common.ErrorResponse(c, 500, "查询失败")
		return
	}

	// 获取分页数据
	var interfaceList []entity.InterfaceInfo
	if err := query.Offset((paging.Page - 1) * paging.PageSize).Limit(paging.PageSize).Find(&interfaceList).Error; err != nil {
		common.ErrorResponse(c, 500, "查询失败")
		return
	}

	common.SuccessPageResponse(c, interfaceList, total, paging.Page, paging.PageSize)
}

// AddInterfaceInfo 新增接口信息
// @Summary 新增接口信息
// @Description 新增一条接口信息
// @Tags 接口信息
// @Accept json
// @Produce json
// @Param interfaceInfo body entity.InterfaceInfo true "接口信息"
// @Success 200 {object} common.Result{data=entity.InterfaceInfo} "成功"
// @Failure 400 {object} common.Result "参数错误"
// @Failure 500 {object} common.Result "新增失败"
// @Router /interface/add [post]
func AddInterfaceInfo(c *gin.Context) {
	var interfaceInfo entity.InterfaceInfo
	if err := c.ShouldBindJSON(&interfaceInfo); err != nil {
		common.ErrorResponse(c, 400, "参数错误")
		return
	}

	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, 500, "数据库连接失败")
		return
	}
	if err := db.Create(&interfaceInfo).Error; err != nil {
		common.ErrorResponse(c, 500, "新增失败")
		return
	}
	common.SuccessResponse(c, interfaceInfo)
}

// UpdateInterfaceInfo 更新接口信息
// @Summary 更新接口信息
// @Description 更新接口信息
// @Tags 接口信息
// @Accept json
// @Produce json
// @Param updateData body map[string]interface{} true "更新数据，必须包含id字段"
// @Success 200 {object} common.Result "成功"
// @Failure 400 {object} common.Result "参数错误"
// @Failure 500 {object} common.Result "更新失败"
// @Router /interface/update [put]
func UpdateInterfaceInfo(c *gin.Context) {
	var updateData map[string]interface{}
	if err := c.ShouldBindJSON(&updateData); err != nil {
		common.ErrorResponse(c, 400, "参数错误")
		return
	}

	id, ok := updateData["id"].(float64)
	if !ok {
		common.ErrorResponse(c, 400, "ID参数错误")
		return
	}

	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, 500, "数据库连接失败")
		return
	}
	if err := db.Model(&entity.InterfaceInfo{}).Where("id = ?", int(id)).Updates(updateData).Error; err != nil {
		common.ErrorResponse(c, 500, "更新失败")
		return
	}
	common.SuccessResponse(c, nil)
}

// DeleteInterfaceInfo 删除接口信息
// @Summary 删除接口信息
// @Description 根据ID删除接口信息
// @Tags 接口信息
// @Accept json
// @Produce json
// @Param id path string true "接口信息ID"
// @Success 200 {object} common.Result "成功"
// @Failure 500 {object} common.Result "删除失败"
// @Router /interface/delete/{id} [delete]
func DeleteInterfaceInfo(c *gin.Context) {
	id := c.Param("id")
	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, 500, "数据库连接失败")
		return
	}
	if err := db.Delete(&entity.InterfaceInfo{}, id).Error; err != nil {
		common.ErrorResponse(c, 500, "删除失败")
		return
	}
	common.SuccessResponse(c, nil)
}
